import { ApiProperty, PartialType, OmitType } from '@nestjs/swagger';
import {
  ModelOptions,
  Prop,
  Index,
  plugin,
  getModelForClass,
  ReturnModelType
} from '@typegoose/typegoose';
import { AutoIncrementID } from '@typegoose/auto-increment';
import { MaxLength, MinLength } from 'class-validator';

/** 用户类 */
// 使用AutoIncrementID插件，设置userId字段自增，从1开始
@plugin(AutoIncrementID, { field: 'companyId', startAt: 1 })
// 创建索引，busRegistNo字段唯一
@Index({ busRegistNo: 1, name: 1 }, { unique: true })
@ModelOptions({
  schemaOptions: {
    //这个选项指定了模型对应的MongoDB集合的名称。在这个例子中，模型将使用名为companys的集合。
    collection: 'company',
    //这个选项启用了Mongoose的自动时间戳功能。当这个选项为true时，Mongoose会在每个文档中自动添加createdAt和updatedAt字段，分别表示文档的创建时间和更新时间。
    timestamps: true
    //这个选项定义了模型在转换为JSON时的行为。virtuals: true表示在转换为JSON时，会包含虚拟属性
    // toJSON: { virtuals: true }
  }
})
export class Company {
  @Prop()
  readonly companyId: number;

  @MinLength(5, { message: '用户名不能少于5位' })
  @MaxLength(20, { message: '用户名不能超过50位' })
  @Prop({ required: true, unique: true, minlength: 3, maxlength: 50 })
  @ApiProperty({
    description: '公司名称',
    example: '石家庄**公司',
    required: true
  })
  name: string;

  @Prop({ required: true, minlength: 3, maxlength: 100 })
  @ApiProperty({
    description: '公司地址',
    example: '河北省石家庄市',
    required: true
  })
  address: string;

  @Prop({ required: true, unique: true, match: /^[a-z0-9]{13,22}/i })
  @ApiProperty({
    description: '工商注册号码',
    example: '9111******401592H',
    required: true
  })
  busRegistNo: string;

  @Prop({ required: true })
  @ApiProperty({ description: '公司电话', example: '0311-***' })
  tel: string;

  @Prop()
  @ApiProperty({ description: '公司传真', example: '423', required: false })
  fax?: string;

  @Prop({ required: true, minlength: 2, maxlength: 20 })
  @ApiProperty({ description: '公司法人', example: '张三' })
  legalPerson: string;

  @Prop({ required: true, minlength: 2, maxlength: 20 })
  @ApiProperty({
    description: '公司开户银行',
    example: '中国银行'
  })
  bankName: string;

  @Prop({ required: true, unique: true })
  @ApiProperty({ description: '公司银行账号', example: '423**' })
  bankAccount: string;

  @Prop()
  @ApiProperty({
    description: '公司邮政编码',
    example: '050000',
    required: false
  })
  postal?: string;

  @Prop()
  @ApiProperty({
    description: '公司邮箱',
    example: 'jckjsjz@163.com',
    required: false
  })
  email?: string;

  @Prop()
  @ApiProperty({
    description: '公司简称',
    example: '**公司',
    required: false
  })
  abbreviation?: string;

  @Prop()
  @ApiProperty({
    description: '联系人',
    example: '胡**',
    required: false
  })
  contacts?: string;

  @Prop()
  @ApiProperty({
    description: '联系人',
    example: true,
    required: false,
    type: Boolean
  })
  status?: boolean;

  @Prop({ type: [String] })
  @ApiProperty({
    description: '公司员工id',
    example: '公司员工id',
    required: false,
    type: [String]
  })
  employeeId?: string[];
}

/** 导出CompanyModel，用于获取Company模型 */
export const CompanyModel = getModelForClass(Company);

/** 定义CompanyModelType，用于返回Company模型的类型 */
export type CompanyModelReturnType = ReturnModelType<typeof Company>;

/** 定义createCompanyDto，用于创建用户 */
export class createCompanyDto extends OmitType(Company, [
  'companyId'
] as const) {}
/** 定义updateUserDto，用于更新用户 */
export class UpdateCompanyDto extends PartialType(
  OmitType(createCompanyDto, ['name'] as const)
) {}
